x86: adjust pirq_spin_lock_irq_desc()
authorJan Beulich <jbeulich@novell.com>
Fri, 1 Jul 2011 19:43:02 +0000 (20:43 +0100)
committerJan Beulich <jbeulich@novell.com>
Fri, 1 Jul 2011 19:43:02 +0000 (20:43 +0100)
Remove unnecessary/bogus assertions and add retry loop matching
domain_spin_lock_irq_desc().

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/irq.c

index f3cb34a7eea25d60a1a838163587cabd1e89a08f..b46fa9b8cb1d46b74932482cd3d30a6f1af3ea12 100644 (file)
@@ -968,30 +968,31 @@ struct irq_desc *domain_spin_lock_irq_desc(
 }
 
 /*
- * Same with struct pirq already looked up, and d->event_lock already
- * held (thus the PIRQ <-> IRQ mapping can't change under our feet).
+ * Same with struct pirq already looked up.
  */
 struct irq_desc *pirq_spin_lock_irq_desc(
     struct domain *d, const struct pirq *pirq, unsigned long *pflags)
 {
-    int irq = pirq->arch.irq;
     struct irq_desc *desc;
     unsigned long flags;
 
-    ASSERT(spin_is_locked(&d->event_lock));
+    for ( ; ; )
+    {
+        int irq = pirq->arch.irq;
 
-    if ( irq <= 0 )
-        return NULL;
+        if ( irq <= 0 )
+            return NULL;
 
-    desc = irq_to_desc(irq);
-    spin_lock_irqsave(&desc->lock, flags);
+        desc = irq_to_desc(irq);
+        spin_lock_irqsave(&desc->lock, flags);
+        if ( irq == pirq->arch.irq )
+            break;
+        spin_unlock_irqrestore(&desc->lock, flags);
+    }
 
     if ( pflags )
         *pflags = flags;
 
-    ASSERT(pirq == pirq_info(d, domain_irq_to_pirq(d, irq)));
-    ASSERT(irq == pirq->arch.irq);
-
     return desc;
 }